<?php
/** gitee的webhook的密钥情景 */
define('GITEE_SECRET', 'your_secure_secret');  // 与 gitee的webhook的密钥情景
define('BRANCH_NAME', 'master');  // 指定分支名称
define('UPDATE_MARK', 'update');  // webhook推送的commit -m 的描述
define('BT_WEBHOOK_URL', 'https://xx.xx.xx.xx:20100/hook?access_key=xxxx');  // 宝塔的webhooks的链接-直接复制即可
// 2. 读取请求头信息（辅助调试）
$requestMethod = $_SERVER['REQUEST_METHOD'];
$contentType = $_SERVER['CONTENT_TYPE'] ?? 'unknown';
$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? 'unknown';
$gitee_token = $_SERVER['HTTP_X_GITEE_TOKEN'] ?? '';  // Gitee 发送的签名
$gitee_timestamp = $_SERVER['HTTP_X_GITEE_TIMESTAMP'] ?? '';  // 时间戳
// 3. 仅处理 POST 请求（Gitee WebHook 仅用 POST 推送）
if ($requestMethod !== 'POST') {
    exit('Method Not Allowed');
}
// 验证 Gitee 签名（核心安全逻辑）
if (empty($gitee_token)) {
    exit('Forbidden: No Signature');
}
// 4. 读取 Gitee 推送的 JSON 数据（核心）
$jsonData = file_get_contents('php://input');
if (empty($jsonData)) {
    exit('Empty Payload');
}

function generateSignature($gitee_timestamp)
{
    // Step1: 拼接签名字符串并计算HMAC-SHA256
    // 配置密钥（需与Gitee仓库设置的密钥一致）
    $secret_key = 'your_secure_secret';  // 替换为实际配置的密钥
    // 验证时间戳有效性（误差不超过1小时）
    $current_time = round(microtime(true) * 1000);  // 当前毫秒时间戳
    $time_diff = abs($current_time - $gitee_timestamp);
    if ($time_diff > 3600000) {  // 1小时=3,600,000毫秒
        exit('Timestamp validation failed 已经超过1H');
    }
    // 生成签名
    $sign_str = $gitee_timestamp . "\n" . $secret_key;
    $hmac_signature = hash_hmac('sha256', $sign_str, $secret_key, true);
    $base64_signature = base64_encode($hmac_signature);
    // $urlencoded_signature = rawurlencode($base64_signature);
    return $base64_signature;
}

/**
 * 发送 GET 请求
 * @param string $url 请求的 URL 地址
 * @param array $params 请求参数（键值对数组）
 * @param int $timeout 超时时间（秒），默认 10 秒
 * @return array 包含状态和结果的数组，成功时 'status' 为 true，'data' 为响应内容；失败时 'status' 为 false，'error' 为错误信息
 *
 *  $params = [
 *      'id' => 123,
 *      'name' => 'test'
 *  ];
 *  $response = httpGet('https://api.example.com/user', $params);
 */
function httpGet($url, $params = [], $timeout = 10)
{
    // 处理参数
    if (!empty($params)) {
        $url .= (strpos($url, '?') === false ? '?' : '&') . http_build_query($params);
    }
    // 初始化 cURL
    $ch = curl_init();
    // 设置 cURL 选项
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  // 将响应保存到变量而不是直接输出
    curl_setopt($ch, CURLOPT_HEADER, false);  // 不包含响应头
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);  // 超时时间
    // 验证ssl
    // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // 验证 SSL 证书
    // curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 验证主机名
    // 不验证ssl
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    // 执行请求并获取响应
    $response = curl_exec($ch);
    // 检查是否有错误发生
    if ($response === false) {
        $error = curl_error($ch);
        curl_close($ch);
        return [
            'status' => false,
            'error' => '请求失败: ' . $error
        ];
    }
    // 获取 HTTP 响应状态码
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    // 关闭 cURL
    curl_close($ch);
    // 检查 HTTP 状态码是否为成功状态（2xx）
    if ($httpCode < 200 || $httpCode >= 300) {
        return [
            'status' => false,
            'error' => "HTTP 状态码错误: {$httpCode}",
            'response' => $response
        ];
    }
    // 尝试解析 JSON 响应
    $jsonData = json_decode($response, true);
    if (json_last_error() === JSON_ERROR_NONE) {
        $response = $jsonData;
    }
    return [
        'status' => true,
        'data' => $response,
        'http_code' => $httpCode
    ];
}

$localSignature = generateSignature($gitee_timestamp);
// // 对比签名（不区分大小写）
if (strtolower($gitee_token) !== strtolower($localSignature)) {
    exit('Forbidden: Invalid Signature');
}
// 5. 解析 JSON 数据
$payload = json_decode($jsonData, true);  // 转为关联数组
if (json_last_error() !== JSON_ERROR_NONE) {
    exit('Invalid JSON');
}
// 6. 提取关键信息（根据需求自定义）
$repoName = $payload['repository']['full_name'] ?? '未知仓库';  // 仓库
$branch = str_replace('refs/heads/', '', $payload['ref'] ?? '未知分支');  // 提取分支名
$latestCommit = $payload['head_commit'] ?? [];  // 最新提交信息
$commitId = $latestCommit['id'] ?? 'N/A';
$commitMsg = trim($latestCommit['message'] ?? 'N/A');
$commitAuthor = $latestCommit['author']['name'] ?? 'N/A';

$flexiblePattern = '/(.*?)\R{2}/s';
if (preg_match($flexiblePattern, $commitMsg, $matches)) {
    if (!empty($matches) && count($matches) > 1) {
        if (trim($matches[0]) === UPDATE_MARK && $branch === BRANCH_NAME) {
            $response = httpGet(BT_WEBHOOK_URL);
            if ($response['status']) {
                print_r($response['data']);
                exit('hooks触发更新');
            } else {
                exit('hooks请求失败：' . $response['error']);
            }
        }
        exit('需要匹配分支【' . BRANCH_NAME . '】,匹配commit信息【' . UPDATE_MARK . '】才能发版');
    }
}

?>